package com.configtools.service;

import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Excel文件处理服务
 * 负责Excel文件的扫描、验证和管理
 * 
 * @author ConfigTools Team
 * @version 1.0.0
 */
@Slf4j
public class ExcelFileService {

    /** 支持的Excel文件扩展名 */
    private static final List<String> EXCEL_EXTENSIONS = Arrays.asList(".xlsx", ".xls");

    /**
     * 扫描指定目录下的所有Excel文件
     * 
     * @param directoryPath 目录路径
     * @return Excel文件列表
     */
    public List<File> scanExcelFiles(String directoryPath) {
        log.info("开始扫描目录: {}", directoryPath);
        
        if (directoryPath == null || directoryPath.trim().isEmpty()) {
            log.warn("目录路径为空");
            return Collections.emptyList();
        }
        
        Path directory = Paths.get(directoryPath);
        
        if (!Files.exists(directory)) {
            log.warn("目录不存在: {}", directoryPath);
            return Collections.emptyList();
        }
        
        if (!Files.isDirectory(directory)) {
            log.warn("路径不是目录: {}", directoryPath);
            return Collections.emptyList();
        }
        
        try {
            List<File> excelFiles = Files.list(directory)
                    .filter(Files::isRegularFile)
                    .map(Path::toFile)
                    .filter(this::isExcelFile)
                    .sorted((f1, f2) -> f1.getName().compareToIgnoreCase(f2.getName()))
                    .collect(Collectors.toList());
            
            log.info("在目录 {} 中发现 {} 个Excel文件", directoryPath, excelFiles.size());
            return excelFiles;
            
        } catch (IOException e) {
            log.error("扫描目录时发生错误: {}", directoryPath, e);
            return Collections.emptyList();
        }
    }

    /**
     * 检查文件是否为Excel文件
     * 过滤掉以~开头的临时文件
     * 
     * @param file 文件对象
     * @return 是否为Excel文件
     */
    public boolean isExcelFile(File file) {
        if (file == null || !file.isFile()) {
            return false;
        }
        
        String fileName = file.getName();
        
        // 过滤掉以~开头的临时文件
        if (fileName.startsWith("~")) {
            log.debug("跳过临时文件: {}", fileName);
            return false;
        }
        
        String lowerCaseFileName = fileName.toLowerCase();
        return EXCEL_EXTENSIONS.stream().anyMatch(lowerCaseFileName::endsWith);
    }

    /**
     * 验证Excel文件是否可读
     * 
     * @param file Excel文件
     * @return 是否可读
     */
    public boolean isExcelFileReadable(File file) {
        if (!isExcelFile(file)) {
            return false;
        }
        
        try {
            return file.exists() && file.canRead() && file.length() > 0;
        } catch (Exception e) {
            log.error("检查文件可读性时发生错误: {}", file.getAbsolutePath(), e);
            return false;
        }
    }

    /**
     * 获取Excel文件的基本信息
     * 
     * @param file Excel文件
     * @return 文件信息字符串
     */
    public String getExcelFileInfo(File file) {
        if (!isExcelFile(file)) {
            return "非Excel文件";
        }
        
        try {
            long size = file.length();
            String sizeStr = formatFileSize(size);
            return String.format("大小: %s", sizeStr);
        } catch (Exception e) {
            log.error("获取文件信息时发生错误: {}", file.getAbsolutePath(), e);
            return "获取信息失败";
        }
    }

    /**
     * 格式化文件大小
     * 
     * @param size 文件大小（字节）
     * @return 格式化后的大小字符串
     */
    private String formatFileSize(long size) {
        if (size < 1024) {
            return size + " B";
        } else if (size < 1024 * 1024) {
            return String.format("%.1f KB", size / 1024.0);
        } else {
            return String.format("%.1f MB", size / (1024.0 * 1024.0));
        }
    }

    /**
     * 检查目录是否有效
     * 
     * @param directoryPath 目录路径
     * @return 是否有效
     */
    public boolean isValidDirectory(String directoryPath) {
        if (directoryPath == null || directoryPath.trim().isEmpty()) {
            return false;
        }
        
        try {
            Path directory = Paths.get(directoryPath);
            return Files.exists(directory) && Files.isDirectory(directory) && Files.isReadable(directory);
        } catch (Exception e) {
            log.error("检查目录有效性时发生错误: {}", directoryPath, e);
            return false;
        }
    }

    /**
     * 创建目录（如果不存在）
     * 
     * @param directoryPath 目录路径
     * @return 是否创建成功
     */
    public boolean createDirectoryIfNotExists(String directoryPath) {
        if (directoryPath == null || directoryPath.trim().isEmpty()) {
            return false;
        }
        
        try {
            Path directory = Paths.get(directoryPath);
            if (!Files.exists(directory)) {
                Files.createDirectories(directory);
                log.info("创建目录: {}", directoryPath);
            }
            return true;
        } catch (Exception e) {
            log.error("创建目录时发生错误: {}", directoryPath, e);
            return false;
        }
    }
}
